概述
存储器分类
按存储介质分类
- 半导体存储器(TTL、MOS)
按材料不同,可分为TTL(双极型)半导体存储器和MOS半导体存储器。
磁表面存储器(磁头、磁载体)
磁芯存储器(硬磁材料、环状元件)
光盘存储器(激光、磁光材料)
按存取方式分类
存取时间与物理地址无关(随机访问)
随机存储器:在程序的执行过程中可读可写。
只读存储器:在程序的执行过程中只读。
存取时间与物理地址有关(串行访问)
顺序存取存储器(磁带)
直接存取存储器(磁盘)
按在计算机中的作用分类
主存储器
RAM(静态RAM、动态RAM)
ROM(MROM、PROM、EPROM、EEPROM)
Flash Memory
高速缓冲存储器(Cache)
辅助存储器(如:磁盘、磁带、光盘)
存储器的层次结构
- 存储器三个主要特性的关系
缓存-主存层次和主存-辅存层次
(1) 主存-辅存层次是为了解决主存容量小的问题。
辅存容量较大,可以将暂时不需要的数据(或指令)保存起来,主存需要时再读取。
主存和辅存的整体,称为虚拟存储器。主存和辅存的地址空间相互独立,所以虚拟存储器中的数据需要虚地址(逻辑地址)来存取。
相对的,主存中的地址称为实地址(物理地址)。
(2) 缓存-主存层次是为了解决主存速度慢的问题。
缓存中保存了主存中部分常用数据(或指令)的副本,以提高CPU对这些常用信息(或指令)的读取速度。
主存储器
概述
主存的基本组成
实际上,通过MAR中的地址访问某个存储单元时,还需要经过地址译码、驱动等电路,才能找到所需访问的单元。读出时,需经过读出放大器,才能将选中单元的存储字送到MDR。写入时,MDR中的数据也必须经过写入电路才能真正写入到被选中单元中。
主存和CPU的联系
主存中存储单元地址的分配
12345678H这个数据如何在主存储器中进行存储?
(1) 高位字节地址为字地址(大端、大尾方式)
(2) 低位字节地址为字地址(小端、小尾方式)
设地址线24根——按字节寻址——2^24 = 16MB
若字长为16位——按 字 寻址——8MW
若字节为32位——按 字 寻址——4MW
主存的技术指标
(1) 存储容量:主存存放二进制代码的总位数。
(2) 存储速度
存取时间:存储器的访问时间(读出时间或写入时间)。
存取周期:连续两次独立的存储器操作(读或写)所需的最小间隔时间。(读周期或写周期)
(3) 存储器带宽
表示单位时间内存储器存取的信息量,单位可用字/秒或字节/秒或位/秒来表示。
计算:若存周期为500ns,每个存储周期可访问16位(数据总线宽度),求它的带宽?
解:
$\frac{16位}{50ns} = \frac{16位×10^9}{50秒} = 32M位/秒$
半导体存储芯片简介
半导体存储芯片的基本结构
译码驱动能把地址总线送过来的地址信号翻译成对应存储单元的选择信号,该信号在读/写电路的配合下完成对选中单元的读/写操作。
读/写电路包括读出放大器和写入电路,用来完成读/写操作。
存储芯片通过地址总线、数据总线和控制总线与外部连接。
片选线:$\overline{CS}$、$\overline{CE}$
读/写控制线:$\overline{WE}$(低电平写 高电平读)
$\overline{OE}$(允许读)、$\overline{WE}$(允许写)
存储芯片片选线的作用:
用16K × 1位的存储芯片组成64K × 8位的存储器:
![32片存储芯片组成64K × 8位的存储器](用16K × 1位的存储芯片组成64K × 8位的存储器.jpg)
当地址为65535时,
由于$64K = 64 × 2^{10} = 65536$,显然,65535保存在最后一组(右)。
可以在最后一组的芯片的同一位置各存放一位数据组成一个字符(共8位)。
半导体存储芯片的译码驱动方式
(1) 线选法
译码器:
以二次译码器为例,2个输入,4个输出。若输入00,则输出线0有效,其他输出线无效;若输入01,则输出线1有效,其他输出线无效。
下图的地址译码器与之类似。输入有四个(A1,A2,A3,A4),输出有16个(2^4,与输入相对应)。
读/写控制电路用来表示位,位线的数量与位数相等。
而对于容量大(m × n)的半导体存储芯片,若使用线选法,则需要大量的数据线(logm + n条)。这严重增加了集成芯片的难度。
(2) 重合法
下图有两根MOS管,用来控制电流的流向,从而切换译码器。
对于m × n的半导体存储芯片,若使用重合法,则需要log(m+n)条数据线。
随机存取存储器
静态RAM(SRAM)
Q:
保存0和1的原理是什么?
基本单元电路的构成是什么?
对单元电路如何读出和写入?
典型芯片的结构是什么样子的?
静态RAM芯片如何进行读出和写入操作?
(1) 静态RAM基本电路
有哪些保存0和1的方式?
开关(开:1;关:0)
熔丝(连通:1;断开:0)- 难以更改
触发器
T1~T4:由MOS管组成的触发器(用来存放0和1)
T5、T6:行开关
T7、T8:列开关
A:触发器原端
A’:触发器非端
① 静态RAM基本电路的读操作
行选 → T5、T6开
列选 → T7、T8开
读操作有效
VA → T6 → T8 → 读放 → Dout
② 静态RAM基本电路的写操作
行选 → T5、T6开
列选 → T7、T8开
写操作有效
DIN → 两个写放
DIN(左) → 反相 → T7 → T5 → A‘
DIN(右) → T8 → T6 → A
(2) 静态RAM芯片举例(简单了解)
① Intel2114外特性
② Intel2114 RAM矩阵(64 × 64) - 读
③ Intel2114 RAM矩阵(64 × 64) -写
动态RAM(DRAM)
Q:
保存0和1的原理是什么?
基本单元电路的构成是什么?
对单元电路如何读出和写入?
典型芯片的结构是什么样子的?
动态RAM芯片如何进行读出和写入操作?
动态RAM为什么要刷新,刷新方法?
(1) 动态RAM基本单元电路
靠电容存储电荷的原理来寄存信息。若电容上存在足够多的电荷表示存“1”,电容上无电荷表示存“0”。
三管式
读出时,先对预充电管T4置一预充电信号,使读数据线达到高电平VDD。然后由读选择线打开T2,若T1的极间电容Cg存有足够电荷(被认为原存“1”),使T1导通,则因T2、T1接地,使读数据线降为零电平,读出“0”信息;若Cg没有足够电荷(原存“0”),则T1截止,读数据线为高电平不变,读出“1”信息。可见,读出线的高低电平可以区分“1”和“0”,且读出与原存信息相反。
写入时,将写信号加到写数据线上,然后由写数据线打开T3,这样,Cg便能随输入信息充电(写“1”)或放电(写“2”),且写入与输入信息相同。
单管式
为了提高集成度,将三管电路简化为单管。
去掉T1,将信息保存到电容 Cs中。
将T2、T3合并为一个管子T。
读出时,字线上的高电平使T接通,若Cs有电荷,视为“1”;若Cs无电荷,视为“0”。(读出结束时,Cs中电荷释放完毕,所以为破坏性读出,必须再生。)
写入时,字线上的高电平使T接通,若数据线为高电平,经过T对Cs充电,使其存“1”;若数据线为低电平,Cs经T放电,使其存“0”。
(2) 动态RAM芯片举例
① 三管动态RAM芯片(Intel 1103) - 读
② 三管动态RAM芯片(Intel 1103) - 写
③ 单管动态RAM 4116 (16K × 1位)外特性
④ 4116(16K × 1位)芯片读原理
⑤ 4116(16K × 1位)芯片写原理
(4) 动态RAM刷新(刷新与行地址有关)
① 集中刷新(存取周期为0.5μs)
以128 × 128为例:
“死区”为 $0.5μs × 128 = 64μs$
“死时间率”为 $128/4000 × 100% = 3.2%$
② 分散刷新(存取周期1μs)
以128 × 128为例:
无“死区”
存取周期为$0.5μs + 0.5μs = 1μs$(周期变长,性能降低)
③ 异步刷新(分散刷新与集中刷新相结合)(存储周期为0.5μs)
对于128×128的存储芯片:
若每隔15.6μs刷新一行
每行每隔2ms刷新一次
死区为0.5μs
将刷新安排在指令译码阶段,不会出现“死区”问题。
动态RAM和静态RAM的比较
DRAM | SRAM | |
---|---|---|
存储原理 | 电容 | 触发器 |
集成度 | 高 | 低 |
芯片引脚 | 少 | 多 |
功耗 | 小 | 大 |
价格 | 低 | 高 |
速度 | 慢 | 快 |
刷新 | 有 | 无 |
DRAM(动态RAM)常用于做主存;SRAM(静态RAM)常用于做缓存。
只读存储器(ROM)
早期的只读存储器——由厂家写内容
改进1——用户可以自己写(一次性)
改进2——可以多次写(要能对信息进行擦除)
改进3——电可擦写(特定设备)
改进4——电可擦写(直接连接到计算机)
掩模ROM(MROM)
行列选择交叉处有MOS管为“1”
行列选择交叉处无MOS管为“0”
PROM(一次性编程)
熔丝断:为“0”
熔丝未断:为“1”
EPROM(多次性编程)
N型沟道浮动栅MOS电路
D端加正电压——形成浮动栅——S与D不导通为“0”
D端不加正电压——不形成浮动栅——S与D导通为“1”
使用紫外线驱散浮动栅(擦除过程麻烦)
EEPROM(多次编程)
电可擦写
局部擦写
全部擦写
Flash Memory(闪速型存储器)
EPROM —— 价格便宜 集成度高
EEPROM —— 电可擦洗重写
Flash Memory —— 比EEPROM快 具备RAM功能
存储器与CPU的连接
存储器容量的扩展
(1) 位扩展(增加存储字长)
用2片1K × 4位存储芯片组成1K × 8位的存储器
1K → 10根地址线
8位 → 8根数据线
(2) 字扩展
用2片1K × 8位存储芯片组成2K × 8位的存储器
2K → 11根地址线
8位 → 8根数据线
(3) 字、位同时扩展
用8片1K × 4位存储芯片组成4K × 8位的存储器
4K → 12根地址线
8位 → 8根数据线
存储器与CPU的连接
(1) 地址线的连接
(2) 数据线的连接
(3) 读/写命令线的连接
(4) 片选线的连接
(5) 合理选择存储芯片
(6) 其他(时序、负载)
例4.1、例4.2。
存储器的校验
为什么要对存储器的信息进行校验?
为了能够校验出信息是否正确,如何进行编码?
检测和纠错能力与什么因素有关?
校验出信息出错后是如何进行纠错的?
除了教材上讲的校验码,你还知道哪些容错编码?原理是什么?
合法代码集合
{000, 001, 010, 011, 100, 101, 110, 111}
若出现错误代码,不会被发现。
检0位错,纠0位错。
{000, 011, 101, 110}(代码中1的个数为偶数。)
若出现错误代码100,能检测到1位错,但并不能纠错(来源可能是000或101或110)。
检1位错,纠0位错。
{000, 111}(3位表示1位)
若出现错误代码100,几乎可以认定是第1位出错了(正确代码为000)。
若出现错误代码110,几乎可以认定是第3位出错了(正确代码为111)。
检1位错,纠1位错。
{0000, 1111}(4位表示1位)
若出现错误代码1000,几乎可以认定是第1位出错了(正确代码为0000)。
若出现错误代码1100,几乎可以认定是第1位出错了(正确代码无法确定)。
检2位错,纠1位错。
{00000, 11111}(5位表示1位)
若出现错误代码11000,几乎可以认定第2、3位出错了(正确代码为00000)。
若出现错误代码11100,几乎可以认定第4、5位出错了(正确代码为11111)。
检2位错,纠2位错。
编码的最小距离
指任意两组合法代码之间二进制位的最少差异数。
编码的纠错、检错能力与编码的最小距离有关。
$L - 1 = D + C (D >= C)$
L —— 编码的最小距离
D —— 检测错误的位数
C —— 纠正错误的位数
例如,当L=3时,这种编码可视为最多能检错二位,或能检错一位、纠错一位。
汉明码是具有一位纠错能力的编码。
汉明码的组成
汉明码采用奇偶检验
汉明码采用分组检验
若要储存的信息为00100011,增加1位校验位100100011,使‘1’的个数为偶数。若读出的信息中‘1’的个数为奇数,即可检1位错。
一种分组方式(基于划分的分组方式):可以采用4位一组,得到10010 00011,若前五位中‘1’为奇数,则前五位有1位错,这样就能大大缩短需要检错的范围。
汉明码的分组是一种非划分方式。
若有7位数据(1 - 2 - 3 - 4 - 5 - 6 - 7),将其分成3组,每组有1位校验位,共包含4位数据位。如下图所示:
按上图方式对三组数据进行奇偶校验(异或),得到校验结果$P_3$,$P_2$,$P_1$。(校验结果为1则该组出错)
结论如下:
如何分组?
第1组:XXXX1(1)
第2组:XXX1X(2)
第3组:XX1XX(4)
第4组:X1XXX(8)
以此类推……
汉明码的组成需要添加多少位检测位?
$2^k>=n+k+1$
检测位的位置?
$2^i(i=0,1,2,3,…)$
检测位的取值?
与该位所在的检测“小组”所承担的奇偶校验任务有关。
各检测位$C_i$所承担的检测小组为:
$C_1$检测的g1小组包含第1, 2, 3, 7, 9, 11, …位(二进制编码为X…XXX1)
$C_2$检测的g2小组包含第2, 3, 6, 7, 10, 11, …位(二进制编码为X…XX1X)
$C_4$检测的g3小组包含第4, 5, 6, 7, 12, 13, …位(二进制编码为X…X1XX)
$C_8$检测的g4小组包含第8, 9, 10, 11, 12, 13, …位(二进制编码为X…1XXX)
……
$g_i$小组独占$2^{i-1}$位,二进制编码为0…10…0
$g_i$和$g_j$小组共同占第$2^{i-1}+2^{j-1}$位,二进制编码为0…010…010…0
$g_i$、$g_j$和$g_l$小组共同占第$2^{i-1}+2^{j-1}+2^{l-1}$位
例题:求0101按“偶校验”配置的汉明码?
解:
$∵n=4$
根据$2^k>=n+k+1$,得$k=3$
汉明码排序如下:
$C_1=3⊕5⊕7=0$
$C_2=3⊕6⊕7=1$
$C_4=5⊕6⊕7=0$
$∴$ 0101的汉明码为 0100101
汉明码的纠错过程
形成新的检验位$P_i$,其位数与增添的检测位有关,
如增添3位(k=3),新的检测位$P_4$、$P_2$、$P_1$
以k=3位例,$P_i$的取值为:
$P_1=1⊕3⊕5⊕7$
$P_2=2⊕3⊕6⊕7$
$P_4=4⊕5⊕6⊕7$
对于按“偶校验”配置的汉明码:
不出错时, $P_1=0$,$P_2=0$,$P_4=0$
例题:已知接收的汉明码为0100111,
(按配偶原则配置)试问要求传送的信息是什么?
解:
纠错过程如下:
$P_1=1⊕3⊕5⊕7=0$ 无错
$P_2=2⊕3⊕6⊕7=1$ 有错
$P_4=4⊕5⊕6⊕7=1$ 有错
即第6位出错,可纠正为0100101,
故要求传送的信息为0101。
提高访问速度的措施
采用高速器件
采用层次结构欧Cache-主存
调整主存结构
单体多字系统
由于程序和数据在存储体内是连续存放的,因此CPU访存取出的信息也是连续的,如果可在一个存储周期内,从同一地址取出4条指令,然后再逐条送至CPU执行,即每隔1/4存取周期,主存向CPU送一条指令,这样显然增大了存储器的带宽,提高了单体存储器的工作速度,如下图所示。
存在的问题:
若只需向存储体写入16位数据(单字长),而数据寄存器却多读出了48位,若想让这48位不存入存储体,会增加寄存器的复杂性。
若需要取出的数据(或指令)不是连续的,必然会使数据寄存器取出无用的数据。
虽然单体多字系统把数据分开存取,但它们依然是以整体的方式存在的。
多体并行系统
高位交叉(顺序编址)
存在的问题:
某个存储体可能会非常繁忙,其余存储体空闲。
这种方式主要适用于存储器容量的扩展,并不适合提高存储器的带宽。
低位交叉(各个体轮流编址)
低位交叉的特点:
在不改变存储周期的前提下,增加存储器的带宽。
以四体低位交叉存储器为例,存储周期位$T$,总线传输周期为$τ$,为实现流水线方式存取,应满足$T=4τ$。
连续读取4个字所需时间位$T+(4-1)τ$
高性能存储芯片
SDRAM(同步RAM)
在系统时钟的控制下进行读出和写入。
CPU无须等待。
RDRAM
由Rambus开发,主要解决存储器带宽问题。
带Cache的DRAM
在DRAM的芯片内集成了一个由SRAM组成的Cache,有利于猝发式读取。
高速缓冲存储器
概述
问题的提出
避免CPU“空等”现象
CPU和主存(DRAM)的速度差异
程序访问的局部性原理:指令和数据在主存的地址分布不是随机的,而是相对的簇聚,使得CPU在执行程序时,访存具有相对的局部性。
Cache工作原理
(1) 主存和缓存的编址
主存和缓存按块存储,块的大小相同。
实际上,缓存中块内地址的意义不大。这是因为主存的块内地址和缓存中的块内地址位数是相同的,而且“块”在主存和Cache之间是整体传输的,块内字节顺序不会发生变化。
缓存中的标记,是用来保存对应主存块号的。若CPU给出一个内存地址,并希望在缓存中访问到这个地址,首先要对比缓存中的标记,确定该块是否已经被读取到了Cache中。
(2) 命中与未命中
缓存共有C块,主存共有M块(M>>C)
命中
主存块调入缓存
主存块与缓冲块建立了对应关系
用标记记录与某缓存块建立了对应的主存块号
未命中
主存块未调入缓存
主存块与缓冲块未建立对应关系
(3) Cache的命中率
CPU欲访问的信息在Cache中的比率
命中率与Cache的容量与块长有关
一般每块可取4~8个字
块长取一个存取周期内从主存调出的信息长度
(4) Cache - 主存系统的效率
效率e与命中率有关
$e=\frac{访问Cache的时间}{平均访问时间}×100%$
设Cache命中率为h,访问Cache的时间为$t_c$,访问主存的时间为$t_m$,
则$e=\frac{t_c}{h×t_c+(1-h)×t_m}×100%$
Cache的基本结构
CPU(通过地址总线)给出地址,这个地址包括(主存)块号和块内地址。块内地址直接传给Cache,使用块号在主存Cache地址映像机构中确认是否命中。如果发生命中,得到Cache的块号;如果未命中,查看Cache中是否有空间可装入主存块。若有,访问主存装入Cache;若没有,启用Cache替换机构,根据替换算法,决定Cache中哪块可以被替换,然后访问主存替换Cache即可。
Cache的读写操作
读
写
写直达法(Write-through)
写操作时数据既写入Cache又写入主存
写操作时间就是访问主存时间,Cache块退出时,不需要对主存执行写操作,更新策略比较容易实现
写回法(Write-back)
写操作只把数据写入Cache而不写入主存
当Cache数据被替换出去时才写回主存
Cache的改进
(1) 增加Cache的级数
片载(片内)Cache
片外Cache
(2) 统一缓存和分立缓存
统一缓存:指令和数据放在同一缓存内的Cache
分立缓存:分成指令Cache、数据Cache
两种缓存的选取主要考虑两个因素:
与主存结构有关。如果计算机的主存是统一的(指令和数据存储在统一主存中),则相应的Cache采用统一缓存;如果主存采用指令、数据分开存储的方案,则相应的Cache采用分立缓存。
与指令执行的控制方式有关。当采用超前控制或流水线控制方式时,一般采用分立缓存。
Cache-主存地址映射
直接映射
根据Cache存储体的大小将主存储体划分成多个区,每个区与Cache存体大小相同。
每个缓存块i可以和若干个主存块对应。
每个主存块j只能和一个缓存块对应。
优点:实现简单,只需利用主存地址的某些位直接判断,就可确定所需字块是否在缓存中。
缺点:不够灵活,因每个内存块只能固定地对应某个缓存块,即使缓存内还空着许多位置也不能占用,使缓存的存储空间得不到充分的利用。此外,如果程序恰好要重复访问对应同一缓存位置的不同主存块,就要不停地进行替换,从而降低命中率。
例题:设主存容量为1MB,采用直接映射方式的Cache容量为16KB,块长为4,每字32位。试问主存地址位ABCDEH的存储单元在Cache中的什么位置?
解:
每块容量:$4×\frac{32}{8}=16B=2^4B$,即字块内地址4位。
块数:$\frac{16KB}{16B}=1K=1024$,即Cache字块地址10位。
主存容量$1MB=2^{20}B$,即地址总格式20位,分为$\frac{1MB}{4×\frac{32}{8}B}=2^{16}$块,每块$2^4B$,采用直接映射方式,主存字块标记为$20-14=6$位。
综上,主存地址格式为:
主存字块标记(6位)Cache字块地址(10位)字块内地址(4位)
主存地址$ABCDEH=(1010 1011 1100 1101 1110)_2$,主存字块标记为101010,Cache字块地址为1111001101,字块内地址为1110,故该主存单元应映射到Cache的101010块的第1110字节,即第42块第14字节位置。
全相联映射
允许主存中每一字块映射到Cache中的任何一块位置上。
优点:灵活,命中率高,缩短了块冲突率。
缺点:
(1) 主存字块标记需要与Cache的所有标记进行同时比较,电路会非常复杂。
(2) 主存字块标记从t位增加到t+c位,这就使Cache”标记“的位数增多,比较器的长度就会增长。
组相联映射
组相联映射是对直接映射和全相联映射的一种折中。
$i = jmodQ$
某一主存块j按模Q映射到缓存的第i组中的任一块。
替换算法
先进先出(FIFO)算法
近期最少使用(LRU)算法
随机法
辅助存储器(非重要)
概述
特点
不直接与CPU交换信息。
磁表面存储器的技术指标
(1) 记录密度(道密度$D_t$、位密度$D_b$)
(2) 存储容量
$C=n×k×s$,n为存放信息的盘面数,k为每个盘面的磁道数,s为每条磁道上记录的二进制代码数。
(3) 平均寻址地址
寻道时间 + 等待时间
辅存的速度:寻址时间、磁头读写时间
(4) 数据传输率
$D_r=D_b×V$
(5) 误码率
出错信息位数与读取信息的总位数。
磁记录原理和记录方式
磁记录原理
写:
读:
硬磁盘存储器
硬磁盘存储器的类型
(1) 固定磁头和移动磁头
(2) 可换盘和固定盘
硬磁盘存储器结构
(1) 磁盘驱动器
(2) 磁盘控制器
接收主机发来的命令,转换成磁盘驱动器的控制命令。
实现主机和驱动器之间的数据格式转换。
控制磁盘驱动器读写。
磁盘控制器是主机与磁盘驱动器之间的接口。
(3) 盘片
由硬质铝合金材料制成。
软磁盘存储器
- 概述
硬盘 | 软盘 | |
---|---|---|
速度 | 高 | 低 |
磁头 | 固定、活动(浮动) | 活动(接触盘片) |
盘片 | 固定盘、盘组大部分不可换 | 可换盘片 |
价格 | 高 | 低 |
环境 | 苛刻 |
软盘片
光盘存储器
概述
采用光存储技术 —- 利用激光写入和读出
第一代光存储技术 —- 采用非磁性介质 —- 不可擦写
第二代光存储技术 —- 采用磁性介质 —- 可擦写
光盘的存储原理
只读型和只写一次型 —- 热作用(物理或化学)
可擦写光盘 —- 热磁效应